/**
 * @file app_control.h
 * @brief 覆冰监测应用程序控制接口
 * @version 1.0
 * @date 2023-03-15
 */

#ifndef APP_CONTROL_H
#define APP_CONTROL_H

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "common_defs.h"
#include "uart_protocol.h"  // 为了获取SensorDataPacket类型
#include "uart_handler.h"   // 为了获取UartConfig类型
#include "data_fusion.h"
#include "visual_monitor.h"
#include "stereo_monitor.h"
#include "simulation.h"     // 添加这个头文件以获取convert_simulation_*_data函数的原型
#include "camera_time_sync.h" // 添加摄像头时间同步支持

#ifdef __cplusplus
extern "C" {
#endif

// 风速阈值 - 全局定义
extern const float HIGH_WIND_THRESHOLD;     // 15m/s以上视为大风
extern const float EXTREME_WIND_THRESHOLD;  // 25m/s以上视为极端大风

// 全局控制变量
extern SampleMode g_sample_mode;
extern RunMode g_run_mode;

// 添加记录上一次覆冰厚度的全局变量，用于状态判断
extern float g_previous_ice_thickness;
extern float g_current_ice_thickness;

// 风险等级名称数组 - 全局定义
extern const char* risk_level_names[5];

// 配置参数结构体
typedef struct {
    int sampling_interval_ms;       // 采样间隔（毫秒）
    char log_file[MAX_PATH_LENGTH]; // 日志文件路径
    int log_level;                  // 日志级别
    bool enable_visual;             // 启用视觉检测
    bool enable_stereo;             // 启用立体视觉
    bool enable_sensor;             // 启用传感器
    bool save_data;                 // 保存数据
    char data_dir[MAX_PATH_LENGTH]; // 数据保存目录
    
    // 视觉监测配置
    VisualMonitorConfig visual_config;
    
    // 立体视觉配置
    StereoMonitorConfig stereo_config;
    
    // 串口配置
    UartConfig uart_config;
    
    // 线缆参数
    CableParameters cable_params;
    
    // 摄像头时间同步标志
    bool sync_camera_time;
    
    // 摄像头认证信息
    CameraAuthInfo cam_400w_auth;   // 400W摄像头
    CameraAuthInfo cam_800w_left_auth;  // 左800W摄像头
    CameraAuthInfo cam_800w_right_auth; // 右800W摄像头
} AppConfig;

// 全局应用程序配置
extern AppConfig g_config;

// 程序启动时间
extern uint64_t g_program_start_time;

// 全局变量
extern volatile bool g_running;
extern int g_camera_capture_count;  // 摄像头捕获模式的图像捕获次数

/**
 * @brief 打印命令行帮助信息
 * 
 * @param program_name 程序名称
 */
void print_usage(const char *program_name);

/**
 * @brief 设置默认配置
 */
void set_default_config(void);

/**
 * @brief 解析命令行参数
 * 
 * @param argc 参数数量
 * @param argv 参数值数组
 * @return int 成功返回0，失败返回非0
 */
int parse_command_line(int argc, char *argv[]);

/**
 * @brief 应用程序系统初始化
 * 重命名以避免与system_utils.c中的init_system冲突
 * 
 * @return int 成功返回0，失败返回非0
 */
int app_init_system(void);

/**
 * @brief 系统清理
 */
void cleanup_system(void);

/**
 * @brief 信号处理函数
 * 
 * @param sig 信号值
 */
void signal_handler(int sig);

/**
 * @brief 保存融合数据
 * 
 * @param data 融合数据指针
 */
void save_fusion_data(const FusionData* data);

/**
 * @brief 转换模拟传感器数据为传感器数据包
 * 此函数在simulation.c中实现
 * 
 * @param packet 数据包指针
 */
void convert_simulation_sensor_data(SensorDataPacket* packet);

/**
 * @brief 同步所有已配置摄像头的时间
 * 
 * @return int 成功返回0，失败返回非0
 */
int sync_all_cameras_time(void);

#ifdef __cplusplus
}
#endif

#endif /* APP_CONTROL_H */ 